home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / xdg-screensaver < prev    next >
Text File  |  2009-02-09  |  19KB  |  787 lines

  1. #!/bin/sh
  2. #---------------------------------------------
  3. #   xdg-screensaver
  4. #
  5. #   Utility script to control screensaver.
  6. #
  7. #   Refer to the usage() function below for usage.
  8. #
  9. #   Copyright 2006, Bryce Harrington <bryce@osdl.org>
  10. #
  11. #   LICENSE:
  12. #
  13. #   Permission is hereby granted, free of charge, to any person obtaining a
  14. #   copy of this software and associated documentation files (the "Software"),
  15. #   to deal in the Software without restriction, including without limitation
  16. #   the rights to use, copy, modify, merge, publish, distribute, sublicense,
  17. #   and/or sell copies of the Software, and to permit persons to whom the
  18. #   Software is furnished to do so, subject to the following conditions:
  19. #
  20. #   The above copyright notice and this permission notice shall be included
  21. #   in all copies or substantial portions of the Software.
  22. #
  23. #   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  24. #   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  25. #   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  26. #   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  27. #   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  28. #   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  29. #   OTHER DEALINGS IN THE SOFTWARE.
  30. #
  31. #---------------------------------------------
  32.  
  33. manualpage()
  34. {
  35. cat << _MANUALPAGE
  36. Name
  37.  
  38. xdg-screensaver - command line tool for controlling the screensaver
  39.  
  40. Synopsis
  41.  
  42. xdg-screensaver suspend WindowID
  43.  
  44. xdg-screensaver resume WindowID
  45.  
  46. xdg-screensaver { activate | lock | reset | status }
  47.  
  48. xdg-screensaver { --help | --manual | --version }
  49.  
  50. Description
  51.  
  52. xdg-screensaver provides commands to control the screensaver.
  53.  
  54. xdg-screensaver is for use inside a desktop session only. It is not recommended
  55. to use xdg-screensaver as root.
  56.  
  57. Commands
  58.  
  59. suspend WindowID
  60.  
  61.     Suspends the screensaver and monitor power management. WindowID must be the
  62.     X Window ID of an existing window of the calling application. The window
  63.     must remain in existance for the duration of the suspension.
  64.  
  65.     WindowID can be represented as either a decimal number or as a hexadecimal
  66.     number consisting of the prefix 0x followed by one or more hexadecimal
  67.     digits.
  68.  
  69.     The screensaver can be suspended in relation to multiple windows at the
  70.     same time. In that case screensaver operation is only restored once the
  71.     screensaver has been resumed in relation to each of the windows
  72.  
  73. resume WindowID
  74.     Resume the screensaver and monitor power management after being suspended.
  75.     WindowID must be the same X Window ID that was passed to a previous call of
  76.     xdg-screensaver suspend
  77. activate
  78.     Turns the screensaver on immediately. This may result in the screen getting
  79.     locked, depending on existing system policies.
  80. lock
  81.     Lock the screen immediately.
  82. reset
  83.     Turns the screensaver off immediately. If the screen was locked the user
  84.     may be asked to authenticate first.
  85. status
  86.     Prints enabled to stdout if the screensaver is enabled to turn on after a
  87.     period of inactivity and prints disabled if the screensaver is not enabled.
  88.  
  89. Options
  90.  
  91. --help
  92.     Show command synopsis.
  93. --manual
  94.     Show this manualpage.
  95. --version
  96.     Show the xdg-utils version information.
  97.  
  98. Exit Codes
  99.  
  100. An exit code of 0 indicates success while a non-zero exit code indicates
  101. failure. The following failure codes can be returned:
  102.  
  103. 1
  104.     Error in command line syntax.
  105. 3
  106.     A required tool could not be found.
  107. 4
  108.     The action failed.
  109.  
  110. Examples
  111.  
  112. xdg-screensaver suspend 0x1c00007
  113.  
  114. Causes the screensaver to be disabled till xdg-screensaver resume 0x1c00007 is
  115. called. 0x1c00007 must be the X Window ID of an existing window.
  116.  
  117. _MANUALPAGE
  118. }
  119.  
  120. usage()
  121. {
  122. cat << _USAGE
  123. xdg-screensaver - command line tool for controlling the screensaver
  124.  
  125. Synopsis
  126.  
  127. xdg-screensaver suspend WindowID
  128.  
  129. xdg-screensaver resume WindowID
  130.  
  131. xdg-screensaver { activate | lock | reset | status }
  132.  
  133. xdg-screensaver { --help | --manual | --version }
  134.  
  135. _USAGE
  136. }
  137.  
  138. #@xdg-utils-common@
  139.  
  140. #----------------------------------------------------------------------------
  141. #   Common utility functions included in all XDG wrapper scripts
  142. #----------------------------------------------------------------------------
  143.  
  144. DEBUG()
  145. {
  146.   [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0;
  147.   [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0;
  148.   shift
  149.   echo "$@" >&2
  150. }
  151.  
  152. #-------------------------------------------------------------
  153. # Exit script on successfully completing the desired operation
  154.  
  155. exit_success()
  156. {
  157.     if [ $# -gt 0 ]; then
  158.         echo "$@"
  159.         echo
  160.     fi
  161.  
  162.     exit 0
  163. }
  164.  
  165.  
  166. #-----------------------------------------
  167. # Exit script on malformed arguments, not enough arguments
  168. # or missing required option.
  169. # prints usage information
  170.  
  171. exit_failure_syntax()
  172. {
  173.     if [ $# -gt 0 ]; then
  174.         echo "xdg-screensaver: $@" >&2
  175.         echo "Try 'xdg-screensaver --help' for more information." >&2
  176.     else
  177.         usage
  178.         echo "Use 'man xdg-screensaver' or 'xdg-screensaver --manual' for additional info."
  179.     fi
  180.  
  181.     exit 1
  182. }
  183.  
  184. #-------------------------------------------------------------
  185. # Exit script on missing file specified on command line
  186.  
  187. exit_failure_file_missing()
  188. {
  189.     if [ $# -gt 0 ]; then
  190.         echo "xdg-screensaver: $@" >&2
  191.     fi
  192.  
  193.     exit 2
  194. }
  195.  
  196. #-------------------------------------------------------------
  197. # Exit script on failure to locate necessary tool applications
  198.  
  199. exit_failure_operation_impossible()
  200. {
  201.     if [ $# -gt 0 ]; then
  202.         echo "xdg-screensaver: $@" >&2
  203.     fi
  204.  
  205.     exit 3
  206. }
  207.  
  208. #-------------------------------------------------------------
  209. # Exit script on failure returned by a tool application
  210.  
  211. exit_failure_operation_failed()
  212. {
  213.     if [ $# -gt 0 ]; then
  214.         echo "xdg-screensaver: $@" >&2
  215.     fi
  216.  
  217.     exit 4
  218. }
  219.  
  220. #------------------------------------------------------------
  221. # Exit script on insufficient permission to read a specified file
  222.  
  223. exit_failure_file_permission_read()
  224. {
  225.     if [ $# -gt 0 ]; then
  226.         echo "xdg-screensaver: $@" >&2
  227.     fi
  228.  
  229.     exit 5
  230. }
  231.  
  232. #------------------------------------------------------------
  233. # Exit script on insufficient permission to read a specified file
  234.  
  235. exit_failure_file_permission_write()
  236. {
  237.     if [ $# -gt 0 ]; then
  238.         echo "xdg-screensaver: $@" >&2
  239.     fi
  240.  
  241.     exit 6
  242. }
  243.  
  244. check_input_file()
  245. {
  246.     if [ ! -e "$1" ]; then
  247.         exit_failure_file_missing "file '$1' does not exist"
  248.     fi
  249.     if [ ! -r "$1" ]; then
  250.         exit_failure_file_permission_read "no permission to read file '$1'"
  251.     fi
  252. }
  253.  
  254. check_vendor_prefix()
  255. {
  256.     file_label="$2"
  257.     [ -n "$file_label" ] || file_label="filename"
  258.     file=`basename "$1"`
  259.     case "$file" in
  260.        [a-zA-Z]*-*)
  261.          return
  262.          ;;
  263.     esac
  264.  
  265.     echo "xdg-screensaver: $file_label '$file' does not have a proper vendor prefix" >&2
  266.     echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2
  267.     echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2
  268.     echo "Use --novendor to override or 'xdg-screensaver --manual' for additional info." >&2
  269.     exit 1
  270. }
  271.  
  272. check_output_file()
  273. {
  274.     # if the file exists, check if it is writeable
  275.     # if it does not exists, check if we are allowed to write on the directory
  276.     if [ -e "$1" ]; then
  277.         if [ ! -w "$1" ]; then
  278.             exit_failure_file_permission_write "no permission to write to file '$1'"
  279.         fi
  280.     else
  281.         DIR=`dirname "$1"`
  282.         if [ ! -w "$DIR" -o ! -x "$DIR" ]; then
  283.             exit_failure_file_permission_write "no permission to create file '$1'"
  284.         fi
  285.     fi
  286. }
  287.  
  288. #----------------------------------------
  289. # Checks for shared commands, e.g. --help
  290.  
  291. check_common_commands()
  292. {
  293.     while [ $# -gt 0 ] ; do
  294.         parm="$1"
  295.         shift
  296.  
  297.         case "$parm" in
  298.             --help)
  299.             usage
  300.             echo "Use 'man xdg-screensaver' or 'xdg-screensaver --manual' for additional info."
  301.             exit_success
  302.             ;;
  303.  
  304.             --manual)
  305.             manualpage
  306.             exit_success
  307.             ;;
  308.  
  309.             --version)
  310.             echo "xdg-screensaver 1.0.1"
  311.             exit_success
  312.             ;;
  313.         esac
  314.     done
  315. }
  316.  
  317. check_common_commands "$@"
  318.  
  319. [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL;
  320. if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then
  321.     # Be silent
  322.     xdg_redirect_output=" > /dev/null 2> /dev/null"
  323. else
  324.     # All output to stderr
  325.     xdg_redirect_output=" >&2"
  326. fi
  327.  
  328. #--------------------------------------
  329. # Checks for known desktop environments
  330. # set variable DE to the desktop environments name, lowercase
  331.  
  332. detectDE()
  333. {
  334.     if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde;
  335.     elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
  336.     elif xprop -root _DT_SAVE_MODE | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
  337.     fi
  338. }
  339.  
  340. #----------------------------------------------------------------------------
  341. # kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4
  342. # It also always returns 1 in KDE 3.4 and earlier
  343. # Simply return 0 in such case
  344.  
  345. kfmclient_fix_exit_code()
  346. {
  347.     version=`kde-config --version 2>/dev/null | grep KDE`
  348.     major=`echo $version | sed 's/KDE: \([0-9]\).*/\1/'`
  349.     minor=`echo $version | sed 's/KDE: [0-9]*\.\([0-9]\).*/\1/'`
  350.     release=`echo $version | sed 's/KDE: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'`
  351.     test "$major" -gt 3 && return $1
  352.     test "$minor" -gt 5 && return $1
  353.     test "$release" -gt 4 && return $1
  354.     return 0
  355. }
  356.  
  357. # Check if we can use "mv -T" 
  358. if mv -T ... ... 2>&1 | grep '\.\.\.' > /dev/null ; then
  359.    # We can securely move files in /tmp with mv -T
  360.    DEBUG 1 "mv -T available"
  361.    MV="mv -T"
  362.    screensaver_file="/tmp/xdg-screensaver-$USER-"`echo $DISPLAY | sed 's/:/-/g'`
  363. else
  364.    # No secure moves available, use home dir
  365.    DEBUG 1 "mv -T not available"
  366.    MV="mv"
  367.    screensaver_file="$HOME/.xdg-screensaver-"`echo $(hostname)-$DISPLAY | sed 's/:/-/g'`
  368. fi
  369. lockfile_command=`which lockfile 2> /dev/null`
  370.  
  371. lockfile()
  372. {
  373.   if [ -n "$lockfile_command" ] ; then
  374.      $lockfile_command -1 -l 10 -s 3 "$screensaver_file".lock
  375.   else
  376.      # Poor man's attempt at doing a lockfile
  377.      # Be careful not to facilitate a symlink attack
  378.      local try
  379.      try=0
  380.      while ! ln -s "$screensaver_file".lock "$screensaver_file".lock 2> /dev/null;
  381.      do
  382.         sleep 1
  383.         try=$(($try+1))
  384.         if [ $try -eq 3 ] ; then 
  385.             rm -f "$screensaver_file".lock || return # Can't remove lockfile
  386.             try=0
  387.         fi
  388.      done
  389.   fi
  390. }
  391.  
  392. unlockfile()
  393. {
  394.   rm -f "$screensaver_file".lock
  395. }
  396.  
  397. perform_action()
  398. {
  399.   result=1
  400.  
  401.   if [ "$1" = "resume" ] ; then
  402.       # Restore DPMS state
  403.       if [ -f "$screensaver_file.dpms" ]; then
  404.           rm "$screensaver_file.dpms"
  405.           # Re-enable DPMS
  406.           xset +dpms
  407.       fi
  408.   fi
  409.   if [ "$1" = "reset" ] ; then
  410.       if xset -q | grep 'DPMS is Enabled' > /dev/null 2> /dev/null; then
  411.           xset dpms force on
  412.       fi
  413.   fi
  414.  
  415.   case "$DE" in
  416.     kde)
  417.       screensaver_kde "$1"
  418.       ;;
  419.  
  420.     gnome)
  421.       screensaver_gnome "$1"
  422.       ;;
  423.  
  424.     xscreensaver)
  425.       screensaver_xscreensaver "$1"
  426.       ;;
  427.   esac
  428.  
  429.   if [ "$1" = "suspend" ] ; then
  430.       # Save DPMS state
  431.       if xset -q | grep 'DPMS is Enabled' > /dev/null 2> /dev/null; then
  432.           test "${TMPDIR+set}" = set || TMPDIR=/tmp
  433.           tmpfile=`mktemp $TMPDIR/tmp.XXXXXXXXXX`
  434.           $MV "$tmpfile" "$screensaver_file.dpms"
  435.           # Disable DPMS
  436.           xset -dpms
  437.       fi
  438.   fi
  439.  
  440. }
  441.  
  442. cleanup_suspend()
  443. {
  444.   lockfile
  445.   test "${TMPDIR+set}" = set || TMPDIR=/tmp
  446.   tmpfile=`mktemp $TMPDIR/tmp.XXXXXXXXXX`
  447.   grep -v "$window_id:$xprop_pid\$" "$screensaver_file" > "$tmpfile" 2> /dev/null
  448.   $MV "$tmpfile" "$screensaver_file"
  449.   if [ ! -s "$screensaver_file" ] ; then
  450.       rm "$screensaver_file"
  451.       unlockfile
  452.       # $screensaver_file is empty, do resume
  453.       perform_action resume
  454.   else
  455.       unlockfile
  456.   fi
  457. }
  458.  
  459. do_resume()
  460. {
  461.   lockfile # Obtain lockfile
  462.   # Find the PID of the trackingprocess
  463.   xprop_pid=`grep "$window_id:" "$screensaver_file" 2> /dev/null | cut -d ':' -f 2` 
  464.   unlockfile # Free lockfile
  465.   if [ -n "$xprop_pid" ] && ps -p "$xprop_pid" 2> /dev/null | grep xprop > /dev/null; then
  466.      # Kill the tracking process 
  467.      kill -s TERM $xprop_pid
  468.   fi
  469.   cleanup_suspend  
  470. }
  471.  
  472. XPROP=`which xprop 2> /dev/null`
  473.  
  474. check_window_id()
  475. {
  476.   if [ -z "$XPROP" ]; then
  477.      DEBUG 3 "xprop not found"
  478.      return
  479.   fi 
  480.   DEBUG 2 "Running $XPROP -id $window_id"
  481.   if $XPROP -id $window_id > /dev/null 2> /dev/null; then
  482.      DEBUG 3 Window $window_id exists
  483.   else
  484.      DEBUG 3 Window $window_id does not exist
  485.      exit_failure_operation_failed "Window $window_id does not exist"
  486.   fi
  487. }
  488.  
  489. track_window()
  490. {
  491.   if [ -z "$XPROP" ]; then
  492.      # Don't track window if we don't have xprop
  493.      return
  494.   fi
  495.   lockfile
  496.  
  497.   test "${TMPDIR+set}" = set || TMPDIR=/tmp
  498.   tmpfile=`mktemp $TMPDIR/tmp.XXXXXXXXXX`
  499.   # Filter stale entries from the xdg-screensaver status file
  500.   # Return if $window_id is being tracked already
  501.   (
  502.     already_tracked=1
  503.     IFS_save="$IFS"
  504.     IFS=":"
  505.     while read wid pid; do
  506.       if ps -p "$pid" 2> /dev/null | grep xprop > /dev/null; then
  507.         echo "$wid:$pid"
  508.         if [ $wid = $window_id ] ; then
  509.           already_tracked=0
  510.         fi   
  511.       fi
  512.     done
  513.     IFS="$IFS_save"
  514.     exit $already_tracked
  515.   ) < $screensaver_file > $tmpfile
  516.   already_tracked=$?
  517.  
  518.   if [ "$already_tracked" -eq "0" ] ; then
  519.     $MV "$tmpfile" "$screensaver_file"
  520.     # We are already tracking $window_id, don't do anything
  521.     unlockfile
  522.     return
  523.   fi
  524.  
  525.   # Start tracking $window_id
  526.   $XPROP -id $window_id -spy > /dev/null &
  527.   xprop_pid=$!
  528.   # Add window_id and xprop_pid to the xdg-screensave status file
  529.   echo "$window_id:$xprop_pid" >> $tmpfile
  530.   $MV "$tmpfile" "$screensaver_file"
  531.   unlockfile
  532.   # Wait for xprop to edit, it means that the window disappeared
  533.   wait $xprop_pid
  534.   # Clean up the administration and resume the screensaver
  535.   cleanup_suspend
  536. }
  537.  
  538. screensaver_kde()
  539. {
  540.     case "$1" in
  541.         suspend) 
  542.         dcop kdesktop KScreensaverIface enable false > /dev/null
  543.         result=$?
  544.         ;;
  545.  
  546.         resume)
  547.         dcop kdesktop KScreensaverIface configure > /dev/null
  548.         result=$?
  549.         ;;
  550.         
  551.         activate)
  552.         dcop kdesktop KScreensaverIface save > /dev/null
  553.         result=$?
  554.         ;;
  555.  
  556.         lock)
  557.         dcop kdesktop KScreensaverIface lock > /dev/null
  558.         result=$?
  559.         ;;
  560.         
  561.         reset)
  562.         # Turns the screensaver off right now
  563.         dcop kdesktop KScreensaverIface quit > /dev/null
  564.         result=$?
  565.         ;;
  566.  
  567.         status)
  568.         status=`dcop kdesktop KScreensaverIface isEnabled`
  569.         result=$?
  570.         if [ x"$status" = "xtrue" ]; then
  571.             echo "enabled"
  572.         elif [ x"$status" = "xfalse" ]; then
  573.             echo "disabled"
  574.         else
  575.             echo "ERROR:  kdesktop KScreensaverIface isEnabled returned '$status'" >&2
  576.             return 1
  577.         fi
  578.         ;;
  579.  
  580.         *)
  581.         echo "ERROR:  Unknown command '$1'" >&2
  582.         return 1
  583.         ;;
  584.     esac
  585. }
  586.  
  587. screensaver_suspend_loop()
  588. {
  589.   lockfile
  590.   test "${TMPDIR+set}" = set || TMPDIR=/tmp
  591.   tmpfile=`mktemp $TMPDIR/tmp.XXXXXXXXXX`
  592.   # Filter stale entries from the xdg-screensaver status file
  593.   cat "$screensaver_file" 2> /dev/null | (
  594.     IFS_save="$IFS"
  595.     IFS=":"
  596.     while read wid pid; do
  597.       if ps -p "$pid" 2> /dev/null | grep xprop > /dev/null; then
  598.         echo "$wid:$pid"
  599.       fi
  600.     done
  601.     IFS="$IFS_save"
  602.   ) > $tmpfile
  603.   if [ -s "$tmpfile" ] ; then
  604.     # Suspend pending, don't do a thing
  605.     $MV "$tmpfile" "$screensaver_file"
  606.     unlockfile
  607.     return  
  608.   fi
  609.   $MV "$tmpfile" "$screensaver_file"
  610.   unlockfile
  611.   (while [ -f "$screensaver_file" ]; do $*; sleep 59; done) > /dev/null 2> /dev/null &
  612. }
  613.  
  614. screensaver_gnome()
  615. {
  616. # TODO
  617. # There seems to be a DBUS interface for gnome-screensaver
  618. # See http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2006-April/042579.html and
  619. # http://cvs.gnome.org/viewcvs/gnome-screensaver/src/gs-listener-dbus.c?rev=1.36&view=log
  620. # A problem seems to be that Inhibit is tied to the lifetime of the DBUS appname and
  621. # this can not be used from a script
  622.     case "$1" in
  623.         suspend) 
  624.         screensaver_suspend_loop gnome-screensaver-command --poke
  625.         result=0
  626.         ;;
  627.  
  628.         resume)
  629.         # Automatic resume when $screensaver_file disappears
  630.         result=0
  631.         ;;
  632.         
  633.         activate)
  634.         gnome-screensaver-command --activate > /dev/null 2> /dev/null
  635.         result=$?
  636.         ;;
  637.         
  638.         lock)
  639.         gnome-screensaver-command --lock > /dev/null 2> /dev/null
  640.         result=$?
  641.         ;;
  642.         
  643.         reset)
  644.         # Turns the screensaver off right now
  645.         gnome-screensaver-command --deactivate > /dev/null 2> /dev/null
  646.         result=$?
  647.         ;;
  648.  
  649.         status)
  650.         result=0
  651.         if [ -f "$screensaver_file" ] ; then
  652.             echo "disabled"
  653.         elif gnome-screensaver-command --query > /dev/null 2> /dev/null; then
  654.             echo "enabled"
  655.         else
  656.             # Something is wrong
  657.             echo "disabled"
  658.         fi
  659.         ;;
  660.  
  661.         *)
  662.         echo "ERROR:  Unknown command '$1" >&2
  663.         return 1
  664.         ;;
  665.     esac
  666. }
  667.  
  668. screensaver_xscreensaver()
  669. {
  670.     case "$1" in
  671.         suspend) 
  672.         screensaver_suspend_loop xscreensaver-command -deactivate
  673.         result=0
  674.         ;;
  675.  
  676.         resume)
  677.         # Automatic resume when $screensaver_file disappears
  678.         result=0
  679.         ;;
  680.         
  681.         activate)
  682.         xscreensaver-command -activate > /dev/null 2> /dev/null
  683.         result=$?
  684.         ;;
  685.  
  686.         lock)
  687.         xscreensaver-command -lock > /dev/null 2> /dev/null
  688.         result=$?
  689.         ;;
  690.         
  691.         reset)
  692.         # Turns the screensaver off right now
  693.         xscreensaver-command -deactivate > /dev/null 2> /dev/null
  694.         result=$?
  695.         ;;
  696.  
  697.         status)
  698.         result=0
  699.         if [ -f "$screensaver_file" ] ; then
  700.             echo "disabled"
  701.         else
  702.             echo "enabled"
  703.         fi
  704.         ;;
  705.  
  706.         *)
  707.         echo "ERROR:  Unknown command '$1" >&2
  708.         return 1
  709.         ;;
  710.     esac
  711. }
  712.  
  713. [ x"$1" != x"" ] || exit_failure_syntax
  714.  
  715. action=
  716. window_id=
  717.  
  718. case $1 in
  719.   suspend)
  720.     action="$1"
  721.     
  722.     shift
  723.  
  724.     if [ -z "$1" ] ; then 
  725.         exit_failure_syntax "WindowID argument missing"
  726.     fi
  727.     
  728.     window_id="$1"
  729.     check_window_id
  730.     ;;
  731.  
  732.   resume)
  733.     action="$1"
  734.     
  735.     shift
  736.  
  737.     if [ -z "$1" ] ; then 
  738.         exit_failure_syntax "WindowID argument missing"
  739.     fi
  740.     
  741.     window_id="$1"
  742.     check_window_id
  743.     ;;
  744.  
  745.   activate)
  746.     action="$1"
  747.     ;;
  748.  
  749.   lock)
  750.     action="$1"
  751.     ;;
  752.  
  753.   reset)
  754.     action="$1"
  755.     ;;
  756.  
  757.   status)
  758.     action="$1"
  759.     ;;
  760.     
  761.   *)
  762.     exit_failure_syntax "unknown command '$1'"
  763.     ;;
  764. esac
  765.  
  766. detectDE
  767. # Consider "xscreensaver" a separate DE
  768. xscreensaver-command -version 2> /dev/null | grep XScreenSaver > /dev/null && DE="xscreensaver"
  769.  
  770. if [ "$action" = "resume" ] ; then
  771.     do_resume
  772.     exit_success
  773. fi
  774.  
  775. perform_action "$action"
  776.  
  777. if [ "$action" = "suspend" ] ; then
  778.     # Start tracking $window_id and resume the screensaver once it disappears
  779.     ( track_window  ) 2> /dev/null > /dev/null &
  780. fi        
  781.  
  782. if [ $result -eq 0 ]; then
  783.     exit_success
  784. else
  785.     exit_failure_operation_failed
  786. fi
  787.